home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / bix02.arc / CAPS.PAS < prev    next >
Pascal/Delphi Source File  |  1986-08-04  |  7KB  |  275 lines

  1. PROGRAM Caps(INPUT,OUTPUT);
  2. (****************************************************************************)
  3. (*                                                                          *)
  4. (*   This program is a result of much frustration with other programs       *)
  5. (* designed to do the same. I wanted a program that capitalized a specific  *)
  6. (* set of words in my pascal programs, and put a row of commented asterisks *)
  7. (* in front of every procedure and function. I also wanted it to capitalize *)
  8. (* the first letter not in the list. This was achieved to a degree by       *)
  9. (* Hermann Calabria's LC. The problem was that it was too slow and it       *)
  10. (* did not capitalize correctly. It also had the nagging problem that       *)
  11. (* strings with comments and quotes were also all capitalized. This program *)
  12. (* fixxes all these things, and keeps the word set in an external file,     *)
  13. (* thus making it easy to modify the word list.                             *)
  14. (*                                                                          *)
  15. (*   I release this program to the public domain, as long as it is not used *)
  16. (* for monetary gain. Otherwise, do as you please with it, and don't come   *)
  17. (* to me to complain about anything. You are resposible for the use of this *)
  18. (* program. Oh, and by the way, make sure that this notice is kept with it. *)
  19. (*                                                                          *)
  20. (*                        Juan Orlandini                                    *)
  21. (*                        7460 SW 174 ST                                    *)
  22. (*                        Miami, FL 33157                                   *)
  23. (*                        (305) 253-0603                                    *)
  24. (****************************************************************************)
  25.  
  26. TYPE Ptr=^Node;
  27.      Str=STRING[20];
  28.      Line=STRING[128];
  29.      Node= RECORD
  30.             Info:Str;
  31.             Left:Ptr;
  32.             Right:Ptr;
  33.            END;
  34.  
  35. VAR Flag,Flag2,Flag3,Flag4:BOOLEAN;
  36.  
  37. (************************************************************************)
  38.  
  39. PROCEDURE Add(VAR N:Ptr; D:Str);
  40. VAR I,T,P:Ptr;
  41. BEGIN
  42.   NEW(I);
  43.   I^.Info:=D;
  44.   I^.Right:=NIL;
  45.   I^.Left:=NIL;
  46.   T:=N; P:=N;
  47.   WHILE T<>NIL DO
  48.    IF D>T^.Info THEN
  49.     BEGIN
  50.      P:=T;
  51.      T:=T^.Right
  52.     END
  53.    ELSE
  54.     BEGIN
  55.      P:=T;
  56.      T:=T^.Left;
  57.     END;
  58.    IF N=NIL THEN N:=I ELSE
  59.      IF D>P^.Info THEN P^.Right:=I ELSE P^.Left:=I;
  60. END;
  61.  
  62. (************************************************************************)
  63.  
  64. PROCEDURE Lowcase(VAR L:Line);
  65. VAR C:INTEGER;
  66.     F,E,G:BOOLEAN;
  67. BEGIN
  68. F:=FALSE; E:=FALSE; G:=FALSE;
  69. FOR C:=1 TO LENGTH(L) DO
  70.   CASE L[C] OF
  71.     #39: F:=NOT(F);
  72.     '}': IF NOT(G) THEN E:=FALSE;
  73.     '{': IF NOT(G) THEN E:=TRUE;
  74.     '(': IF (C<>LENGTH(L)) AND (L[C+1]='*') AND NOT(E) THEN G:=TRUE;
  75.     ')': IF (C>1) AND (L[C-1]='*') AND NOT(E) THEN G:=FALSE;
  76.     'A'..'Z': IF NOT(E OR F OR G) THEN L[C]:=CHR(ORD(L[C])+32);
  77.   END;
  78. END;
  79.  
  80. (************************************************************************)
  81.  
  82. FUNCTION Up(W:Str):Str;
  83. VAR I:INTEGER;
  84. BEGIN
  85.  FOR I:=1 TO LENGTH(W) DO W[I]:=UPCASE(W[I]);
  86.  Up:=W;
  87. END;
  88.  
  89. (************************************************************************)
  90.  
  91. PROCEDURE Getword(L:Line; VAR C:INTEGER; VAR W:Str);
  92.  
  93. BEGIN
  94. W:='';
  95. WHILE (C<=LENGTH(L)) AND (L[C] IN ['a'..'z']) DO
  96.  BEGIN
  97.   W:=W+L[C];
  98.   C:=C+1;
  99.  END;
  100. END;
  101.  
  102. (************************************************************************)
  103.  
  104. PROCEDURE Nextone(L:Line; VAR C:INTEGER; VAR W:Line);
  105. BEGIN
  106. W:='';
  107. IF NOT(Flag OR Flag2 OR Flag4) THEN
  108. WHILE (C<=LENGTH(L)) AND NOT(L[C] IN ['a'..'z']) DO
  109.  BEGIN
  110.   IF (L[C]=#123) AND NOT(Flag2 OR Flag4) THEN Flag:=TRUE;
  111.   IF (L[C]=#125) AND NOT(Flag2 OR Flag4) THEN Flag:=FALSE;
  112.   IF (C<LENGTH(L)) AND (L[C]='(') AND (L[C+1]='*')
  113.      AND NOT(Flag2 OR Flag) THEN Flag4:=TRUE;
  114.   IF (NOT(Flag OR Flag4) AND (L[C]=#39)) THEN Flag2:=NOT(Flag2);
  115.   W:=W+L[C];
  116.   C:=C+1;
  117.  END
  118. ELSE
  119.  WHILE (C<=LENGTH(L)) AND (Flag OR Flag2 OR Flag4) DO
  120.   BEGIN
  121.    IF Flag AND (L[C]=#125) THEN Flag:=FALSE;
  122.    IF (L[C]=')') AND (C>1) AND (L[C-1]='*') AND NOT(Flag OR Flag2)
  123.        THEN Flag4:=FALSE;
  124.    IF NOT(Flag OR Flag4) AND (L[C]=#39) THEN Flag2:=NOT(Flag2);
  125.    W:=W+L[C];
  126.    C:=C+1;
  127.   END;
  128. END;
  129.  
  130. (************************************************************************)
  131.  
  132. FUNCTION Nerd(W:Str):Str;
  133. BEGIN
  134. W[1]:=UPCASE(W[1]);
  135. Nerd:=W;
  136. END;
  137.  
  138. (************************************************************************)
  139.  
  140. FUNCTION Word(Root:Ptr; W:Str):BOOLEAN;
  141. VAR X:BOOLEAN;
  142.     T:Ptr;
  143.  
  144. BEGIN
  145. X:=FALSE; T:=Root;
  146. WHILE NOT(X) AND  (T<>NIL) DO
  147.   IF T^.Info=W THEN X:=TRUE ELSE
  148.    IF W>T^.Info THEN T:=T^.Right ELSE T:=T^.Left;
  149. IF X AND ((W='procedure') OR (W='function')) THEN Flag3:=TRUE;
  150. Word:=X;
  151. END;
  152.  
  153. (************************************************************************)
  154.  
  155. PROCEDURE Change(Root:Ptr; VAR L:Line);
  156. VAR C:INTEGER;
  157.     W:Str;
  158.     O,S:Line;
  159.  
  160. BEGIN
  161. IF NOT(Flag OR Flag2 OR Flag4) THEN Lowcase(L);
  162. C:=1; O:='';
  163. Nextone(L,C,S);
  164. O:=O+S;
  165. IF Flag OR Flag4 THEN
  166.  BEGIN
  167.   WHILE (Flag OR Flag4) AND (C<=LENGTH(L)) DO
  168.    BEGIN
  169.     Nextone(L,C,S);
  170.     O:=O+S;
  171.    END;
  172.   Nextone(L,C,S);
  173.   O:=O+S;
  174.  END
  175. ELSE
  176. WHILE C<=LENGTH(L) DO
  177.  BEGIN
  178.   IF NOT(Flag OR Flag2 OR Flag4) THEN
  179.    BEGIN
  180.     Getword(L,C,W);
  181.     IF Word(Root,W) THEN O:=O+Up(W) ELSE O:=O+Nerd(W);
  182.    END;
  183.   Nextone(L,C,S);
  184.   O:=O+S;
  185.  END;
  186. L:=O;
  187. END;
  188.  
  189. (************************************************************************)
  190.  
  191. PROCEDURE Readwords(VAR Root:Ptr);
  192. VAR F:TEXT;
  193.     N:Str;
  194.     C:INTEGER;
  195.  
  196. BEGIN
  197. C:=0;
  198. ASSIGN(F,'words');
  199. RESET(F);
  200. WHILE NOT(Eof(F)) DO
  201.  BEGIN
  202.   READLN(F,N);
  203.   Add(Root,N);
  204.   C:=C+1;
  205.  END;
  206. Close(F);
  207. END;
  208.  
  209. (************************************************************************)
  210.  
  211. PROCEDURE Openfile(M:Line; VAR P:TEXT; S:BOOLEAN);
  212. VAR N:Str;
  213.     F:BOOLEAN;
  214.  
  215. BEGIN
  216. F:=FALSE;
  217. WHILE NOT(F) DO
  218.  BEGIN
  219.   WRITE(M);
  220.   READLN(N);
  221.   ASSIGN(P,N);
  222.   IF S THEN
  223.    BEGIN
  224.     {$I-} RESET(P); {$I+}
  225.     F:=IORESULT=0;
  226.    END
  227.   ELSE
  228.    BEGIN
  229.     REWRITE(P);
  230.     F:=TRUE;
  231.    END;
  232.  END;
  233. END;
  234.  
  235. (************************************************************************)
  236.  
  237. PROCEDURE Main;
  238. VAR Root:Ptr;
  239.     L:Line;
  240.     F,O:TEXT;
  241.  
  242. BEGIN
  243. Flag:=FALSE;
  244. Flag2:=FALSE;
  245. Flag3:=FALSE;
  246. Flag4:=FALSE;
  247. Root:=NIL;
  248. Readwords(Root);
  249. Openfile('file to read  :',F,TRUE);
  250. Openfile('file to write :',O,FALSE);
  251. WHILE NOT Eof(F) DO
  252.  BEGIN
  253.   READLN(F,L);
  254.   IF L<>'' THEN Change(Root,L);
  255.   IF Flag3 THEN
  256.     BEGIN
  257.  
  258. *********)');
  259.  
  260. *********)');
  261.      WRITELN(O);
  262.      WRITELN;
  263.      Flag3:=FALSE;
  264.     END;
  265.   WRITELN(O,L);
  266.   WRITELN(L);
  267.  END;
  268. Close(F);
  269. Close(O);
  270. END;
  271.  
  272. BEGIN
  273. Main;
  274. END.
  275.